//
//  HMUserAccountViewModel.swift
//  Weibo
//
//  Created by xiongminghua on 16/7/22.
//  Copyright © 2016年 熊明华. All rights reserved.
//

import UIKit

// MVVM 设计模式：

/// 负责处理 模型：HMUserAccount 的业务逻辑
/// 网络请求
/// 字典转模型
/// 保存模型到沙盒中
/// 沙盒加载模型到内存中

class HMUserAccountViewModel: NSObject {
    
    // 设置为一个单例， 方便外面调用
    static let sharedUserAccountViewModel: HMUserAccountViewModel = HMUserAccountViewModel()
    
    // 设置保存在沙盒中的文件路径
    let userAccountFile = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last!.stringByAppendingString("/userAccount.plist")
    
    /// 用户模型属性，用来保存用户的账号
    var userAccount: HMUserAccount?
    
    /// 记录用户是否登录
    var isLogin: Bool {
        
        get {
            // 有账号，表示用户登录过
            return userAccount != nil
        }
    }
    
    
    override init() {
        super.init()
        
        // 读取沙盒中的账号
        userAccount = loadAccount()
    }
    
    
    // 网络请求业务：封装从网络上获取数据的方法，可以减轻控制器的代码管理
    
    /// 发送POST请求网络数据，获取access_token
    func getAccessToken(code: String, completion: (error: NSError?) -> Void) {
        
        let urlString = "https://api.weibo.com/oauth2/access_token"
        
        // 参数
        let parameters = [
            
            "client_id": client_id,
            "client_secret": client_secret,
            "grant_type": "authorization_code",
            "code": code,
            "redirect_uri": redirect_uri
        ]
        
        // 使用AFN发送POST请求 ， 获取access_token
        HMAFNetworkTool.sharedAFNetwork.POST(urlString, parameters: parameters, progress: nil, success: { (_, resopnseObject) -> Void in
            //            print("resopnseObject: \(resopnseObject)")
            
            // 字典转模型
            let dict = resopnseObject as! [String: AnyObject]
             self.userAccount = HMUserAccount(dict: dict)
            
            print("userAccount: \(self.userAccount)")
            
            // 将模型数据保存到沙盒，使用归档
            NSKeyedArchiver.archiveRootObject(self.userAccount!, toFile: self.userAccountFile)
            
            // 保存账号后回调
            completion(error: nil)
            
            }) { (_, error) -> Void in
                
              completion(error: error)
        }
        
    }
    
     // 从沙盒中读取模型数据，解档
    private func loadAccount() -> HMUserAccount? {
        // 解档，从沙盒中获取数据
        let account = NSKeyedUnarchiver.unarchiveObjectWithFile(userAccountFile) as? HMUserAccount
        
        // 如果有账号，判断账号是否过期
        if account != nil && account?.expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            // 账号没有过期
            return account
        }
        return nil
    }
    
}



